/*
*	File: CoreSkeleton.cpp
*	Date: 12/07/2011
*	Author: Ivan Gao
*	Desc:
*/
#include "CoreSkeleton.h"
#include "CoreBone.h"

SCoreSkeleton::SCoreSkeleton () : m_skeletonName ("default"), m_sceneAmbientColor (1.0f, 1.0f, 1.0f)
{
	m_mapCoreBoneNames.clear();
	m_vecRootCoreBonesId.clear();
	m_vecCoreBones.clear ();
}

SCoreSkeleton::SCoreSkeleton (const string & strName) : m_skeletonName (strName), m_sceneAmbientColor (1.0f, 1.0f, 1.0f)
{
	m_mapCoreBoneNames.clear ();
	m_vecRootCoreBonesId.clear ();
	m_vecCoreBones.clear ();
}

SCoreSkeleton::~SCoreSkeleton ()
{

}

int SCoreSkeleton::AddCoreBone (SCoreBone * pCoreBone)
{
	if (!pCoreBone)
	{
		return -1;
	} // if
	int nBoneId = m_vecCoreBones.size ();
	m_vecCoreBones.push_back(pCoreBone);
	if (pCoreBone->GetParentId() == -1)
	{
		m_vecRootCoreBonesId.push_back (nBoneId);
	}
	m_mapCoreBoneNames.insert (make_pair (pCoreBone->GetBoneName(), nBoneId));
	return nBoneId;
} // AddCoreBone

void SCoreSkeleton::RecursivelyCalculateState ()
{
	vector<int>::iterator itr = m_vecRootCoreBonesId.begin();
	while (itr != m_vecRootCoreBonesId.end ())
	{
		m_vecCoreBones[*itr]->RecursiveCalculateState();
		++ itr;
	} // while
} // RecursivelyCalculateState

SCoreBone * SCoreSkeleton::GetCoreBone (int nCoreBoneId)
{
	if (nCoreBoneId < 0 || nCoreBoneId > (int)m_vecCoreBones.size ())
	{
		return NULL;
	} // if
	return m_vecCoreBones[nCoreBoneId];
} // GetCoreBone

const SCoreBone * SCoreSkeleton::GetCoreBone (int nCoreBoneId) const
{
	if (nCoreBoneId < 0 || nCoreBoneId > (int)m_vecCoreBones.size ())
	{
		return NULL;
	} // if
	return m_vecCoreBones[nCoreBoneId];
} // GetCoreBone

SCoreBone * SCoreSkeleton::GetCoreBone (const string & strName)
{
	map<string, int>::iterator itr = m_mapCoreBoneNames.find(strName);
	if (itr != m_mapCoreBoneNames.end ())
	{
		return m_vecCoreBones[itr->second];
	} // if
	return NULL;
} // GetCoreBone

const SCoreBone * SCoreSkeleton::GetCoreBone (const string & strName) const 
{
	map<string, int>::const_iterator itr = m_mapCoreBoneNames.find(strName);
	if (itr != m_mapCoreBoneNames.end ())
	{
		return m_vecCoreBones[itr->second];
	} // if
	return NULL;
} // GetCoreBone

bool SCoreSkeleton::MapCoreBoneName (int nCoreBoneId, const string strName)
{
	if (nCoreBoneId < 0 || nCoreBoneId >= (int)m_vecCoreBones.size ())
	{
		return false;
	} // if
	m_mapCoreBoneNames[strName] = nCoreBoneId;
	return true;
} // MapCoreBoneName

vector<int> & SCoreSkeleton::GetVectorRootCoreBoneId ()
{
	return m_vecRootCoreBonesId;
} // GetVectorRootCoreBoneId

const vector<int> & SCoreSkeleton::GetVectorRootCoreBoneId () const
{
	return m_vecRootCoreBonesId;
} // GetVectorRootCoreBoneId

void SCoreSkeleton::Scale (float scale)
{
	vector<int>::iterator itr = m_vecRootCoreBonesId.begin();
	while (itr != m_vecRootCoreBonesId.end ())
	{
		m_vecCoreBones[*itr]->Scale (scale);
	} // while
} // Scale

int SCoreSkeleton::GetNumCoreBones () const
{
	return m_vecCoreBones.size ();
} // GetNumCoreBones

void SCoreSkeleton::SetSceneAmbientColor (SVector3 & ambientColor)
{
	m_sceneAmbientColor = ambientColor;
} // SetSceneAmbientColor

const SVector3 & SCoreSkeleton::GetSceneAmbientColor () const
{
	return m_sceneAmbientColor;
} // GetSceneAmbientColor

void SCoreSkeleton::SetName (const string & strName)
{
	m_skeletonName = strName;	
} // SetName

const string & SCoreSkeleton::GetName () const
{
	return m_skeletonName;
} // GetName